---
title: 自訂主題
description: 建立自訂主題
---

# 自訂主題

## 建立自訂主題

> 注意：此 API 不穩定，可能會在不久的將來發生變化。我們建議暫時使用[內建主題](/docs/theming)。

雖然內建主題提供了一定程度的自訂設置，但`Theme`型別有助於您定義自己的自訂主題，並深入訪問底層主題變數。

```tsx
import { RainbowKitProvider, Theme } from '@rainbow-me/rainbowkit';

const myCustomTheme: Theme = {
  blurs: {
    modalOverlay: '...',
  },
  colors: {
    accentColor: '...',
    accentColorForeground: '...',
    actionButtonBorder: '...',
    actionButtonBorderMobile: '...',
    actionButtonSecondaryBackground: '...',
    closeButton: '...',
    closeButtonBackground: '...',
    connectButtonBackground: '...',
    connectButtonBackgroundError: '...',
    connectButtonInnerBackground: '...',
    connectButtonText: '...',
    connectButtonTextError: '...',
    connectionIndicator: '...',
    downloadBottomCardBackground: '...',
    downloadTopCardBackground: '...',
    error: '...',
    generalBorder: '...',
    generalBorderDim: '...',
    menuItemBackground: '...',
    modalBackdrop: '...',
    modalBackground: '...',
    modalBorder: '...',
    modalText: '...',
    modalTextDim: '...',
    modalTextSecondary: '...',
    profileAction: '...',
    profileActionHover: '...',
    profileForeground: '...',
    selectedOptionBorder: '...',
    standby: '...',
  },
  fonts: {
    body: '...',
  },
  radii: {
    actionButton: '...',
    connectButton: '...',
    menuButton: '...',
    modal: '...',
    modalMobile: '...',
  },
  shadows: {
    connectButton: '...',
    dialog: '...',
    profileDetailsAction: '...',
    selectedOption: '...',
    selectedWallet: '...',
    walletLogo: '...',
  },
};

const App = () => (
  <RainbowKitProvider theme={myCustomTheme} {...etc}>
    {/* Your App */}
  </RainbowKitProvider>;
)
```

### 擴展內建主題

您可以擴展內建主題而無需重新定義整個主題。這對於您只想覆蓋特定主題標記時非常有用。

為此，請安裝`lodash.merge`（或其他等效套件）：

```bash
npm install lodash.merge
```

導入它，以及您要擴展的主題（例如：`darkTheme`）和 TypeScript 的`Theme`型別：

```tsx
import merge from 'lodash.merge';
import {
  RainbowKitProvider,
  darkTheme,
  Theme,
} from '@rainbow-me/rainbowkit';
```

然後，將內建主題與您希望覆蓋的主題標記合併。在此範例中，我將`accentColor`標記覆蓋為品牌的強調顏色。

```tsx
const myTheme = merge(darkTheme(), {
  colors: {
    accentColor: '#07296d',
  },
} as Theme);
```

最後，您可以將自訂主題傳遞給`RainbowKitProvider`的`theme`屬性。

```tsx
const App = () => {
  return (
    <RainbowKitProvider theme={myTheme} {...etc}>
      {/* Your App */}
    </RainbowKitProvider>
  );
};
```

### 創建自訂主題選擇器

如果您的應用是伺服器/靜態渲染的，並允許用戶手動切換主題，RainbowKit 的主題系統可以通過以下功能與任何 CSS-in-JS 系統的自訂 CSS 選擇器掛鉤：

- `cssStringFromTheme`
- `cssObjectFromTheme`

這些功能會返回設置所有所需主題變數的 CSS。由於支持字符串和對象，因此可以與任何 CSS-in-JS 系統集成。

作為基本範例，您可以渲染自己的`style`元素，為每個主題設置自訂選擇器。由於我們控制主題的 CSS 渲染，所以將`null`傳遞給`theme`屬性，以使 RainbowKitProvider 不會為我們渲染任何樣式。此外，請注意擴展 cssStringFromTheme 函數中的`extends`選項，以省略與基礎主題相同的任何主題變數。

```tsx
import {
  RainbowKitProvider,
  cssStringFromTheme,
  lightTheme,
  darkTheme,
} from '@rainbow-me/rainbowkit';

const App = () => {
  return (
    <RainbowKitProvider theme={null} {...etc}>
      <style
        dangerouslySetInnerHTML={{
          __html: `
            :root {
              ${cssStringFromTheme(lightTheme)}
            }

            html[data-dark] {
              ${cssStringFromTheme(darkTheme, {
                extends: lightTheme,
              })}
            }
          `,
        }}
      />

      {/* ... */}
    </RainbowKitProvider>
  );
};
```
